<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>函数的扩展</title>
	</head>
	<body>
		<script>
			//支持默认值
			let a = 1;
			function foo (a=1,b){
				return a;
			}
			foo();//1;
			
			//作用域原理，优先使用参数值
			let b = 2; 
			function foo2(b,y=b){
				return y;
			}
			foo2(4); //4
			
			//箭头函数
			let f = v => v;
			//等价于：
			let f1 = function (v){
				return v;
			}
			
			let f2 = (a,b)=>{
				return a+b;
			}
			console.log(f2(2,3));
			//箭头函数的this指向可以继承上一个对象
			function foo3(){
				setTimeout(()=>{
					console.log(this.name);
				},1000)
			}
			foo3.call({name:"zhangsan"});
			
			let person = {name:"zhangsan"};
			//双冒号运算符
			
			//let method = person::foo3;
			//method();
				
		// 等同于
	
		function f() {
			let m = 1;
			let n = 2;
			return g(m + n);
			}
			f();

			function g(){
				console.log(12)
			}
			function f() {
			return g(3);
			}
			f();

		// 等同于
		g(3);
/*上面代码中，如果函数g不是尾调用，函数f就需要保存内部变量m和n的值、g的调用位置等信息。但由于调用g之后，函数f就结束了，所以执行到最后一步，完全可以删除f(x)的调用帧，只保留g(3)的调用帧。

这就叫做“尾调用优化”（Tail call optimization），即只保留内层函数的调用帧。如果所有函数都是尾调用，那么完全可以做到每次执行时，调用帧只有一项，这将大大节省内存。这就是“尾调用优化”的意义。

注意，只有不再用到外层函数的内部变量，内层函数的调用帧才会取代外层函数的调用帧，否则就无法进行“尾调用优化”*/

		
					
		</script>
	</body>
</html>
